import logging
from logging.handlers import RotatingFileHandler
import redis
from flask import Flask
from flask.ext.wtf.csrf import generate_csrf
from flask_session import Session
from flask_sqlalchemy import SQLAlchemy
from flask_wtf import CSRFProtect




def set_log(config_name):
    """日志配置"""
    # 设置日志的记录等级
    logging.basicConfig(level=config_name.LOG_LEVEL)
    # 创建日志记录器，指明日志保存的路径，每个日志文件的最大大小、保存的日志文件个数上限
    file_log_handler = RotatingFileHandler("logs/log",maxBytes=1024*1024,backupCount=10)
    # 创建日志记录的格式，日志等级，输入日志信息的文件名，行数，日志信息
    formatter = logging.Formatter("%(levelname)s%(filename)s:%(lineno)d%(message)s")
    # 为刚创建的日志记录器设置日志记录格式
    file_log_handler.setFormatter(formatter)
    # 为全局的日志工具对象（flask app）使用的添加日志记录器
    logging.getLogger().addHandler(file_log_handler)


redis_store = None  # type:redis.StrictRedis
# 配置mysql数据库
db = SQLAlchemy()
def create_app(config_name):
    app = Flask(__name__)
    # 导入配置文件
    app.config.from_object(config_name)
    # 调用init_app方法传入app参数
    db.init_app(app)
    # 配置redis数据库
    global redis_store
    redis_store = redis.StrictRedis(host=config_name.host_redis,port=config_name.port_redis,decode_responses=True)
    # CSRF保护
    CSRFProtect(app)
    @app.after_request
    def after_request(response):
        csrf_token = generate_csrf()
        response.set_cookie('csrf_token',csrf_token)
        return response

    # 增加自定义过滤器
    from utils.common import do_index_class
    app.add_template_filter(do_index_class,'index_class')

    # Session配置
    Session(app)
    # 调用日志函数，传入config_name参数
    set_log(config_name)

    # 导入蓝图模块，并注册蓝图
    #   主页模块
    from info.modules.index import blu
    app.register_blueprint(blu)
    #   登录注册模块
    from info.modules.passport import passport_blu
    app.register_blueprint(passport_blu)
    #   新闻详情模块
    from info.modules.news import news_blu
    app.register_blueprint(news_blu)
    #   个人信息模块
    from info.modules.profile import profile_blu
    app.register_blueprint(profile_blu)
    #   后台管理模块
    from info.modules.admin import admin_blu
    app.register_blueprint(admin_blu)
    # 返回app
    return app
